#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
jmp_buf jmpbuf;
static int d()
{
	printf("%s start\n",__FUNCTION__);
	printf("call fun d\n");
	longjmp(jmpbuf,5);
	printf("%s end\n",__FUNCTION__); 
	return 0;
}
static int c()
{
	printf("%s start\n",__FUNCTION__);
	printf("call fun c\n");
	d();
	printf("%s end\n",__FUNCTION__); 
	return 0;
}
static int b()
{
	printf("%s start\n",__FUNCTION__);
	printf("call fun b\n");
	c();
	printf("%s end\n",__FUNCTION__); 
	return 0;
}
static int a()
{
	int ret;
	printf("%s start\n",__FUNCTION__);
	ret=setjmp(jmpbuf);
	if(ret==0)
	{
		 printf("call fun a\n");
		 b();
	}
	else
	{
		printf("%s jump back here with code%d\n",__FUNCTION__,ret);
	}
//	printf("call fun a\n");
//	b();
	printf("%s end\n",__FUNCTION__); 
	return 0;
}

int main()
{
	printf("%s start\n",__FUNCTION__);
	printf("call fun a\n");
	a();
	printf("%s end\n",__FUNCTION__);

	return 0;
}
